package designModel;
// 工厂方法（Factory Method）模式：定义一个用于创建产品的接口，由子类决定生产什么产品。  ☆☆☆☆☆
public class Factory {
    public static void main(String[] args) {
        System.out.println("简单工厂, 每添加一个类 要改工厂对应生产的对象");
       /* SimpleFactory simpleFactory = new SimpleFactory();
        BMW bmw320 = simpleFactory.createBMW(320);
        BMW bmw523 = simpleFactory.createBMW(523);
        BMW bmwBMW886 = simpleFactory.createBMW(886);*/

        System.out.println("工厂方法模式"); // 就是厂变多了...
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        BMW320 bmw320 = factoryBMW320.createBMW();

        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        BMW523 bmw523 = (BMW523) factoryBMW523.createBMW();
        // BMW bmw523 = factoryBMW523.createBMW();

    }
}

// 简单工厂模式
// 缺点在于不符合“开闭原则”，每次添加新产品就需要修改工厂类。在产品类型较多时，有可能造成工厂逻辑过于复杂，不利于系统的扩展维护

/*
abstract class BMW {
    public BMW(){}
}

 class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造-->BMW320");
    }
}
 class BMW523 extends BMW{
    public BMW523(){
        System.out.println("制造-->BMW523");
    }
}
class BMW886 extends BMW{
    public BMW886(){
        System.out.println("制造-->BMW523");
    }
}
 class SimpleFactory {
    public BMW createBMW(int type) {
        switch (type) {

            case 320:
                return new BMW320();

            case 523:
                return new BMW523();
            case 886:
                return new BMW886();
            default:
                break;
        }
        return null;
    }
}
*/

// 工厂方法模式将工厂抽象化，并定义一个创建对象的接口。
// 每增加新产品 只需增加该产品以及对应的具体实现工厂类，由具体工厂类决定要实例化的产品是哪个，将对象的创建与实例化延迟到子类
// 这样工厂的设计就符合“开闭原则”了，扩展时不必去修改原来的代码
abstract class BMW {
    public BMW(){}
}

class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造-->BMW320");
    }
}
// 造宝马的接口工厂  实现接口时,可以写BMW的子类..
class BMW523 extends BMW{
    public BMW523(){
        System.out.println("制造-->BMW523");
    }
}

// 1、只写一个类 里面写if else 根据传参 创建对应的车 属于简单工厂方法
// 2、工厂方法, 抽象化造车的方法,根据具体的类重写具体的造车方法 => 造车的厂的造车方法抽象化
interface FactoryBMW {
    BMW createBMW();
}

class FactoryBMW320 implements FactoryBMW{
    @Override
    // 返回值类型BMW320
    public BMW320 createBMW() {
        return new BMW320(); // 调构造函数
    }
   /*  public BMW createBMW() {
         return new BMW320(); // 调构造函数
     }*/
}
class FactoryBMW523 implements FactoryBMW {
    @Override
    // 返回值类型BMW523
 /*   public BMW523 createBMW() {
        return new BMW523();// 调构造函数
    }*/
    // 或者
     public BMW createBMW(){
        return new BMW523();
    }
}


